package com.example.lambda.rx01

import org.junit.Test


/**
 * 自己手写RxJava的功能
 *
 * @author zhouronghua
 * @time 2022/3/26 4:26 下午
 */
class RxJavaTest {

    @Test
    fun testTxJava() {
        create {
            "AAA"
            "BBB"
        } map {
            12.444
        } consume {
            println("最终结果$it")
        }

        create {
            "aaBB"
        } map {
            it.toString().repeat(2)
        } map {
            it.capitalize()
        } consume {
            println("接收到的结果是 $it")
        }
    }


}

/**
 * 中转站
 * 负责将数据进行上游往下游传递
 * Helper带有一个成员，Item@T。这个item是一个输入参数，一直在更新
 */
class Helper<T>(private var Item: T) {
    /**
     * 将上游的类型T，转换为中转站对象R
     */
    infix fun <R> map(action: (T) -> R): Helper<R> {
        return Helper(action(Item))
    }

    /**
     * 输入参数进行lambda函数执行
     */
    infix fun consume(action: (T) -> Unit) {
        action(Item)
    }
}

/**
 * 创建数据流
 * 说明: 输入参数没有，输出参数是一个函数:lambda表达式
 * 中转站就是为了转换（）保存我们create和map的数据，
 */
fun <R> create(action: () -> R): Helper<R> {
    val r = action()
    // 将创建的数据往中转站传递
    return Helper(r)
}